////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxifegamma16.h
/// @brief ifegamma16 class declarations
/// @brief camxifegamma16 class declarations
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXIFEGAMMA16_H
#define CAMXIFEGAMMA16_H

#include "camxformats.h"
#include "camxispiqmodule.h"
#include "gamma_1_6_0.h"
#include "iqcommondefs.h"
#include "titan170_ife.h"

CAMX_NAMESPACE_BEGIN

CAMX_BEGIN_PACKED

// @brief: This structure contains the register list of the Gamma16 module
struct IFEGamma16RegCmd
{
    IFE_IFE_0_VFE_RGB_LUT_CFG rgb_lut_cfg; ///< RGB_LUT_CFG
} CAMX_PACKED;

CAMX_END_PACKED

static const UINT32 IFEGamma16RegLengthDword      = sizeof(IFEGamma16RegCmd) / sizeof(UINT32);
static const UINT8  IFEGamma16NumDMITables        = 3;
static const UINT32 Gamma16NumberOfEntriesPerLUT  = 64;
static const UINT32 IFEGamma16LutTableSize        = Gamma16NumberOfEntriesPerLUT * sizeof(UINT32);
static const UINT32 IFEGamma16DMILengthDword      = Gamma16NumberOfEntriesPerLUT * IFEGamma16NumDMITables;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class for IFE Gamma16 Module
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class IFEGamma16 final : public ISPIQModule
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Create
    ///
    /// @brief  Create IFEGamma16 Object
    ///
    /// @param  pCreateData Pointer to data for Gamma Creation
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    static CamxResult Create(
        IFEModuleCreateData* pCreateData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Execute
    ///
    /// @brief  Generate Settings for Gamma Object
    ///
    /// @param  pInputData Pointer to the Inputdata
    ///
    /// @return CamxResultSuccess if successful.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual CamxResult Execute(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetRegCmd
    ///
    /// @brief  Retrieve the buffer of the register value
    ///
    /// @return Pointer of the register buffer
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual VOID* GetRegCmd();

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~IFEGamma16
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~IFEGamma16();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// IFEGamma16
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    IFEGamma16();

private:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CheckDependenceChange
    ///
    /// @brief  Check if the Dependence Data has changed
    ///
    /// @param  pInputData Point to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL CheckDependenceChange(
        ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// RunCalculation
    ///
    /// @brief  Perform the Interpolation and Calculation
    ///
    /// @param  pInputData Point to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult RunCalculation(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateCmdList
    ///
    /// @brief  Generate the Command List
    ///
    /// @param  pInputData Pointer to the Input Data
    ///
    /// @return CamxResultSuccess if successful
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    CamxResult CreateCmdList(
        const ISPInputData* pInputData);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateIFEInternalData
    ///
    /// @brief  Initialize the Module Data
    ///
    /// @param  pInputData Pointer to the ISP input data
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID UpdateIFEInternalData(
        ISPInputData* pInputData);

    IFEGamma16(const IFEGamma16&)            = delete; ///< Disallow the copy constructor
    IFEGamma16& operator=(const IFEGamma16&) = delete; ///< Disallow assignment operator

    Gamma16InputData     m_dependenceData;              ///< Dependence Data for this module
    UINT8                m_channelRLUTBankSelect;       ///< Bank Selection for R Channel Lut
    UINT8                m_channelGLUTBankSelect;       ///< Bank Selection for G Channel Lut
    UINT8                m_channelBLUTBankSelect;       ///< Bank Selection for B Channel Lut
    IFEGamma16RegCmd     m_regCmd;                      ///< Registercmd variable
    UINT32*              m_pGammaG[GammaMaxChannel];    ///< Pointer to Gamma LUT
};

CAMX_NAMESPACE_END

#endif // CAMXIFEGAMMA16_H
